/*
    Rust中的迭代器由Iterator这个trait来表示，表示会产生一个序列的值：
    这个trait只有一个Required的方法next，当next返回None的时候，表示序列结束
    
    可以直接调用next方法来一个一个的获取值，但是更多的场景下是使用标准库中提供的adapter和consume方法。
*/

struct Fibonacci {
    current: u64,
    next: u64,
}

impl Fibonacci {
    fn new() -> Fibonacci {
        Fibonacci { current: 0, next: 1 }
    }
}

impl Iterator for Fibonacci {
    type Item = u64;

    fn next(&mut self) -> Option<Self::Item> {
        let next_number = self.current + self.next;
        self.current = self.next;
        self.next = next_number;
        Some(self.current)
    }
}

#[test]
pub fn main() {
    let fib_iterator = Fibonacci::new();

    println!("使用迭代器，获得前10个元素：");
    for number in fib_iterator.take(10) {
        println!("{}", number);
    }

    let fib_vec: Vec<u64> = Fibonacci::new().take(15).collect();
    println!("\n获得前15个元素的集合:{:?}", fib_vec);
}